/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tida.servir.pages;

import com.tida.servir.components.Envelope;
import com.tida.servir.entities.*;
import helpers.*;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.apache.tapestry5.ajax.MultiZoneUpdate;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.apache.tapestry5.services.ApplicationGlobals;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.upload.services.UploadedFile;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import org.apache.tapestry5.StreamResponse;
import org.apache.tapestry5.corelib.components.TextField;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.services.FieldValidatorSource;
import org.apache.tapestry5.services.Response;

/**
 *
 * @author ale
 */
public class SolicitudAcceso {

    @Inject
    private Session session;
    @Inject
    private PropertyAccess _access;
    @Inject
    private Request _request;
    @InjectComponent
    private Envelope envelope;
    //campos
//    @Property
//    @Persist
//    private Funcionario trabajador;
    @Property
    @Persist
    private Solicitud_Acceso nuevasolicitud;
    @Property
    @Persist
    private String bentidad;
    @Property
    @Persist
    private DatoAuxiliar bdocumentoidentidad;
    @PageActivationContext
    private String codSolicitudAcceso;
//    private Solicitud_Acceso bIdSolicitud_Acceso;//en caso se desee editar... 
    @Property
    @Persist
    private boolean ventanaNuevo;//hay dos casos la creacion y la edicion
    @Property
    @Persist
    private String bnroDocumento;
    @Property
    @Persist
    private String bapellidoPaterno;
    @Property
    @Persist
    private String bapellidoMaterno;
    @Property
    @Persist
    private String bnombres;
    @Property
    @Persist
    private String bemailLaboral;
    @Property
    @Persist
    private String btelefonofijo;
    @Property
    @Persist
    private String bnum_resolucion;
    @Property
    @Persist
    private String bcargo;
    @Property
    @Persist
    private String bdocumento_adjunto;
    @Component(id = "formSolicitud")
    private Form formSolicitud;
    @Component(id = "formsubida")
    private Form formsubida;
    @InjectComponent
    private Zone mensajeZone;
    @InjectComponent
    private Zone solicitudZone;
    @InjectComponent
    private Zone entidadZone;
    @InjectComponent
    private Zone DarBajaZone;
    @InjectComponent
    private Zone CargarDocumentoZone;
    @Property
    @Persist
    private String fecharesolu;
    @Property
    @Persist
    private UploadedFile fileNuevo;
    @Property
    @Persist
    private UploadedFile fileEditar;
    //campos modal
    @Property
    @Persist
    private String bdenoentidad;
    @Property
    @Persist
    private LkBusquedaEntidad rowentidad;
    @InjectComponent
    private Zone busquedamodalZone;
    @Property
    @Persist
    private Entidad selecentidad;
    @Property
    @Persist
    private boolean mostrarlista;
    @Persist
    private String nombreArchivo;
    @Persist
    private String lugarArchivo;
    @Property
    @Persist
    private File copied;
    @Property
    @Persist
    private Boolean procesoFin;
    @Property
    @Persist
    private Boolean procesoConfirmarDarBaja;
    @Property
    @Persist
    private Boolean etapaInicio;
    @Property
    @Persist
    private Boolean respuestaOk;
    @Inject
    private ApplicationGlobals globals;
    @Persist
    private long traba;
    @Persist
    private long entidad;
    @Property
    @Persist
    private Perfil bperfil;
    @Persist
    private String STARTPATH;
    @Property
    @Persist
    private Boolean datosPersonalesDisabled;
    @Property
    @Persist
    private Boolean solicitanteEsFuncionario;//si quien hace la solicitud esta en la tabla funcionario
    @Property
    @Persist
    private Usuario usuarioDarBaja;
    @Property
    @Persist
    private String mensajeErrorRENIEC;
    @Persist
    private Usuario usuarioSolicitud;
    @Property
    @Persist
    private int maxlength;
    @Persist
    private String regeVali;
    @InjectComponent
    private TextField nrodocumento;
    @Inject
    private FieldValidatorSource fieldValidatorSource;
    @Inject
    private Messages messages;
    @Property
    private Boolean existeSolicitud;

    public org.apache.tapestry5.FieldValidator getValidator() {
        //return new FieldValidator().getValidator(nrodocumento, regeVali);
        return fieldValidatorSource.createValidators(nrodocumento, "required,regexp=" + regeVali);
    }

    // inicio de la pagina
    @Log
    @SetupRender
    private void inicio() {
        Criteria c;
        nuevasolicitud = new Solicitud_Acceso();
        usuarioSolicitud = new Usuario();
        STARTPATH = getRuta().get(0).getRuta_final();
        mostrarlista = false;
        existeSolicitud = true;
        if (bdocumentoidentidad == null) {
            regeVali = "^[0-9]{8}$";
            maxlength = 8;
        }
        if (codSolicitudAcceso != null) {
            c = session.createCriteria(Solicitud_Acceso.class);
            c.add(Restrictions.eq("codigo", codSolicitudAcceso));
            nuevasolicitud = (Solicitud_Acceso) c.uniqueResult();
            existeSolicitud = false;
            //respuestaOk = false;
            if (nuevasolicitud != null) {
                if (nuevasolicitud.getEstado() == 4) {
                    existeSolicitud = true;
                }
            }
            if (existeSolicitud) {
                ventanaNuevo = false;
                respuestaOk = false;
                bnombres = nuevasolicitud.getNombres();
                System.out.println(nuevasolicitud.getApellidoPaterno());
                System.out.println("===========================================================");
                bapellidoPaterno = nuevasolicitud.getApellidoPaterno();
                bapellidoMaterno = nuevasolicitud.getApellidoMaterno();
                bemailLaboral = nuevasolicitud.getEmail();
                if (btelefonofijo == null) {
                    btelefonofijo = nuevasolicitud.getTelefono();
                }
                if (bcargo == null) {
                    bcargo = nuevasolicitud.getDen_cargo();
                }
                if (bperfil == null) {
                    bperfil = nuevasolicitud.getPerfil();
                }
                if (bnum_resolucion == null) {
                    bnum_resolucion = nuevasolicitud.getNum_resolucion();
                }
                if (fecharesolu == null) {
                    SimpleDateFormat formatoDelTexto;
                    formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
                    fecharesolu = formatoDelTexto.format(nuevasolicitud.getFec_resolucion());
                }
                usuarioSolicitud = (Usuario) session.load(Usuario.class, getUsuarioBySolicitudID(null, nuevasolicitud.getId(), null).get(0).getId());
                bentidad = usuarioSolicitud.getEntidad().getDenominacion();
                selecentidad = usuarioSolicitud.getEntidad();
                entidad = usuarioSolicitud.getEntidad().getId();
                bdocumentoidentidad = nuevasolicitud.getDocumentoidentidad();
                bnroDocumento = nuevasolicitud.getNroDocumento();
                //trabajador = nuevasolicitud.;
                bdocumento_adjunto = nuevasolicitud.getDocumento();
            } else {
                if (respuestaOk != null) {
                    if (respuestaOk) {
                        existeSolicitud = true;
                    }
                }
            }
        } else {
//            if (ventanaNuevo = false;)
//            onReset();
        }
    }

    @Log
    public List<ConfiguracionAcceso> getRuta() {
        Criteria c = session.createCriteria(ConfiguracionAcceso.class);
        return c.list();
    }

    @Log
    void onActivate() {
        if (etapaInicio == null) {
            etapaInicio = true;
            procesoFin = false;
            procesoConfirmarDarBaja = false;
            usuarioDarBaja = new Usuario();
            datosPersonalesDisabled = true;
            solicitanteEsFuncionario = true;
            ventanaNuevo = true;
        }
    }

//    @Log
//    public com.tida.servir.services.GenericSelectModel<DatoAuxiliar> getBeandocumentoidentidad() {
//        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("DOCUMENTOIDENTIDAD", null, 0, session);
//        return new com.tida.servir.services.GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "abrev", "id", _access);        
//    }
    @Log
    public com.tida.servir.services.GenericSelectModel<DatoAuxiliar> getBeandocumentoidentidad() {
        List<Long> lista = new ArrayList<Long>();
        lista.add(new Long(1));
        lista.add(new Long(2));
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.eq("nombreTabla", "DOCUMENTOIDENTIDAD"));
        c.add(Restrictions.in("codigo", lista));
        return new com.tida.servir.services.GenericSelectModel<DatoAuxiliar>(c.list(), DatoAuxiliar.class, "abrev", "id", _access);
    }

    @Log
    public com.tida.servir.services.GenericSelectModel<Perfil> getBeanperfil() {
        List<Perfil> list;
        Criteria c = session.createCriteria(Perfil.class);
        c.add(Restrictions.in("id", new Long[]{3L, 5L, 6L}));
        list = c.list();
        return new com.tida.servir.services.GenericSelectModel<Perfil>(list, Perfil.class, "descperfil", "id", _access);
    }

//    @Log
//    public List<LkBusquedaTrabajador> getTrabajador(String nrodocumento) throws ParseException {
//        Criteria criterio = session.createCriteria(LkBusquedaTrabajador.class);
//        criterio.add(Restrictions.eq("estado", true));
//        criterio.add(Restrictions.eq("entidad_id", selecentidad.getId()));
//        criterio.add(Restrictions.eq("nrodocumento", nrodocumento));
//        return criterio.list();
//    }

    @Log
    public List<Funcionario> getFuncionario(Long tipoDocumento, String nrodocumento)
            throws ParseException {
        Criteria criterio = session.createCriteria(Funcionario.class);
        //criterio.add(Restrictions.eq("estado", true));
        criterio.add(Restrictions.eq("documentoidentidad.id", tipoDocumento));
        criterio.add(Restrictions.eq("nroDocumento", nrodocumento));
        return criterio.list();
    }

    @Log
    public List<LkBusquedaPerfilEntidad> getUsuarioAdministrador(Long entidadID)
            throws ParseException {
        Criteria criterio = session.createCriteria(LkBusquedaPerfilEntidad.class);
        criterio.add(Restrictions.eq("estadousuario", 1L));
        criterio.add(Restrictions.eq("entidadid", entidadID));
        criterio.add(Restrictions.eq("perfilid", 3L));
        return criterio.list();
    }

    @Log
    public List<LkBusquedaEntidad> getListadoEntidades() {
        List<LkBusquedaEntidad> listaEntidad;
        Criteria c = session.createCriteria(LkBusquedaEntidad.class);
        c.add(Restrictions.eq("estado", true));
        if (bdenoentidad != null) {
            c.add(Restrictions.disjunction().
                    add(Restrictions.like("denominacion", "%" + bdenoentidad + "%").ignoreCase()).
                    add(Restrictions.like("denominacion", "%" + bdenoentidad.replaceAll("ñ", "n") + "%").ignoreCase()).
                    add(Restrictions.like("denominacion", "%" + bdenoentidad.replaceAll("n", "ñ") + "%").ignoreCase()).
                    add(Restrictions.like("descriptores", "%" + bdenoentidad + "%").ignoreCase()).
                    add(Restrictions.like("descriptores", "%" + bdenoentidad.replaceAll("ñ", "n") + "%").ignoreCase()).
                    add(Restrictions.like("descriptores", "%" + bdenoentidad.replaceAll("n", "ñ") + "%").ignoreCase()).
                    add(Restrictions.like("SIGLA", "%" + bdenoentidad + "%").ignoreCase()).
                    add(Restrictions.like("SIGLA", "%" + bdenoentidad.replaceAll("ñ", "n") + "%").ignoreCase()).
                    add(Restrictions.like("SIGLA", "%" + bdenoentidad.replaceAll("n", "ñ") + "%").ignoreCase()));
        }
        listaEntidad = c.list();
        nroentidad = Integer.toString(listaEntidad.size());
        return listaEntidad;
    }
    @Persist
    @Property
    private String nroentidad;

    @Log
    Object onActionFromSeleccionarentidad(Entidad enti) {
        bentidad = enti.getDenominacion();
        selecentidad = enti;
        entidad = enti.getId();
        respuestaOk = false;
        //return this;
        return entidadZone.getBody();
    }

    @Log
    @CommitAfter
    Object onSuccessFromformbusquedaentidad() {
        mostrarlista = true;
        return busquedamodalZone.getBody();
    }

    @Log
    Object onBuscartraba() {
        Criteria c;
        formSolicitud.clearErrors();
        System.out.println("error");
        bnombres = null;
        bapellidoPaterno = null;
        bapellidoMaterno = null;
        bemailLaboral = null;
        btelefonofijo = null;
        bcargo = null;
        respuestaOk = false;
        datosPersonalesDisabled = true;
        solicitanteEsFuncionario = true;
//        trabajador = null;

        if (bdocumentoidentidad == null) {
            c = session.createCriteria(DatoAuxiliar.class);
            c.add(Restrictions.eq("codigo", 1L));
            c.add(Restrictions.eq("nombreTabla", "DOCUMENTOIDENTIDAD"));
            bdocumentoidentidad = (DatoAuxiliar) c.uniqueResult();
            //formSolicitud.recordError("Tiene que ingresar Tipo de Documento");
            //return solicitudZone.getBody();
            //return this;
        }
        if (bnroDocumento == null) {
            formSolicitud.recordError("Tiene que ingresar Numero de Documento");
            //return solicitudZone.getBody();
            return this;
        }

        try {
            List<Funcionario> busqueda = getFuncionario(bdocumentoidentidad.getId(), bnroDocumento);
            if (busqueda.size() > 0) {
                bnombres = busqueda.get(0).getNombres();
                bapellidoPaterno = busqueda.get(0).getApellidoPaterno();
                bapellidoMaterno = busqueda.get(0).getApellidoMaterno();
                bemailLaboral = "";//busqueda.get(0).getEmail();
                btelefonofijo = "";//busqueda.get(0).getTelefono();
                bcargo = busqueda.get(0).getDen_cargo();
//                trabajador = (Funcionario) session.load(Funcionario.class, busqueda.get(0).getId());
//                traba = trabajador.getId();
            } else {
                c = session.createCriteria(ConfiguracionAcceso.class);
                ConfiguracionAcceso parametro = (ConfiguracionAcceso) c.uniqueResult();
                System.out.println("Documento = " + bdocumentoidentidad.getId());
                if (bdocumentoidentidad.getId() == 190L && parametro.getUseReniec() == 1) {//Tipo de documento DNI
                    try {
                        ServicioReniec treniec = new ServicioReniec();
                        treniec.obtenerToken();

                        if (treniec.validarToken(session) == true) {
                            System.out.println("BUSCAR DNI");
                            List<String> result = treniec.obtenerResultado(bnroDocumento);
                            mensajeErrorRENIEC = "";

                            if (validarEstadoConsulta(result.get(0), session) == true) {
                                System.out.println("Paterno : " + result.get(1));
                                System.out.println("Materno : " + result.get(2));
                                System.out.println("Nombre : " + result.get(4));

                                bnombres = result.get(4);
                                bapellidoPaterno = result.get(1);
                                bapellidoMaterno = result.get(2);

                                solicitanteEsFuncionario = false;
                            } else {
                                System.out.println("mensajeErrorRENIEC :" + mensajeErrorRENIEC);

                                if (result.get(0).equals("DNE")) {
                                    formSolicitud.recordError("El DNI consultado es inválido.");
                                    return this;
                                } else {
                                    formSolicitud.recordError("Hubo un error en el Sistema, intentarlo luego.");
                                    return this;
                                }
                            }
                        } else {
                            System.out.println("Token no valido.");
                            formSolicitud.recordError("Hubo un error en el Sistema, intentarlo luego.");
                            return this;
                        }

                    } catch (Exception ex) {
                        System.out.println(ex.toString());
                        formSolicitud.recordError("Hubo un error en el Sistema. Por favor intentarlo luego.");
                        return this;
                    }
                } else {
                    //si elige por i.e. C.E. permitir ingresar datos personales
                    datosPersonalesDisabled = false;
                    solicitanteEsFuncionario = false;
                }

                return solicitudZone.getBody();
                //return this;
            }
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }

        return solicitudZone.getBody();
    }

    @Log
    void onBnroDocumentoChanged() {
        bnroDocumento = _request.getParameter("param");
    }

    @Log
    Object onReset() {
        bnombres = null;
        bapellidoPaterno = null;
        bapellidoMaterno = null;
        bemailLaboral = null;
        btelefonofijo = null;
        bcargo = null;
        bentidad = null;
        bdocumentoidentidad = null;
        bnroDocumento = null;
        nuevasolicitud = new Solicitud_Acceso();
//        trabajador = null;
        selecentidad = null;
        fecharesolu = null;
        etapaInicio = true;
        procesoFin = false;
        procesoConfirmarDarBaja = false;
        datosPersonalesDisabled = true;
        solicitanteEsFuncionario = true;
        return this;
    }

    @Log
    Object onCancel() {
        return "Index";
    }

    @Log
    Object onCancelar() {
        etapaInicio = true;
        procesoFin = false;
        procesoConfirmarDarBaja = false;
        return this;
    }

    @Log
    @CommitAfter
    Object onSuccessFromformSolicitud() {
        if (selecentidad == null) {
            formSolicitud.recordError("Tiene que seleccionar la Entidad");
            //return new MultiZoneUpdate("solicitudZone", solicitudZone.getBody()).add("mensajeZone", mensajeZone.getBody());
            //return solicitudZone.getBody();
            return this;
        }
        if (bemailLaboral == null) {
            formSolicitud.recordError("Tiene que ingresar Email");
            //return solicitudZone.getBody();
            return this;
        }
        if (btelefonofijo == null) {
            formSolicitud.recordError("Tiene que ingresar Telefono");
            //return solicitudZone.getBody();
            return this;
        }
        if (bcargo == null) {
            formSolicitud.recordError("Tiene que ingresar Cargo");
            //return solicitudZone.getBody();
            return this;
        }
        if (bperfil == null) {
            formSolicitud.recordError("Tiene que ingresar Perfil");
            return solicitudZone.getBody();
        }
        //check si hay un administrador para la entidad seleccionada
        //if (trabajador != null) {
        List<UsuarioTrabajador> listUsuarios;
        listUsuarios = getUsuarios(bdocumentoidentidad.getId(), bnroDocumento, "3", null);
        if (listUsuarios.size() > 0) {
            formSolicitud.recordError("Lo sentimos. Tiene una Solicitud de Acceso por Aprobación.");
            //return solicitudZone.getBody();
            return this;
        }
        //listUsuarios = getUsuarios(trabajador.getId(), "1", selecentidad.getId());
        listUsuarios = getUsuarios(bdocumentoidentidad.getId(), bnroDocumento, "1", null);
        if (listUsuarios.size() > 0) {
            formSolicitud.recordError("Lo Sentimos. Ya cuenta con un Usuario registrado.");
            //return solicitudZone.getBody();
            return this;
        }
        //}

        if (bperfil.getId() == 3) { //ADMINISTRADOR SANCIONES ENTIDAD
            try {
                List<LkBusquedaPerfilEntidad> listaAdmin = getUsuarioAdministrador(selecentidad.getId());
                if (listaAdmin.size() > 0) {
                    Criteria c = session.createCriteria(Usuario.class);
                    c.add(Restrictions.eq("id", listaAdmin.get(0).getUsuarioid()));
                    usuarioDarBaja = (Usuario) c.list().get(0);
                    etapaInicio = false;
                    procesoConfirmarDarBaja = true;
                    respuestaOk = false;
                    //return new MultiZoneUpdate("solicitudZone", solicitudZone.getBody()).add("DarBajaZone", DarBajaZone.getBody());
                    return this;
                }

            } catch (Exception ex) {
            }
        }

        etapaInicio = false;
        procesoFin = true;
        respuestaOk = false;

//        return new MultiZoneUpdate("solicitudZone", solicitudZone.getBody())
//                .add("CargarDocumentoZone", CargarDocumentoZone.getBody());
        return this;
    }

    @Log
    @CommitAfter
    Object onSuccessFromformconfirmarbaja() {
        etapaInicio = false;
        procesoFin = true;
        respuestaOk = false;
        procesoConfirmarDarBaja = false;
        return this;
    }

    @Log
    @CommitAfter
    Object onSuccessFromformsubida() {
        int error = 0;
        formsubida.clearErrors();
        if (fecharesolu != null) {
            SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
            try {
                nuevasolicitud.setFec_resolucion((Date) formatoDelTexto.parse(fecharesolu));
            } catch (ParseException ex) {
                ex.printStackTrace();
            }
        }
        if (nuevasolicitud.getFec_resolucion().after(new Date())) {
            formsubida.recordError("La Fecha de Resolucion no debe ser mayor a la Actual");
            error = 1;
        }
        Date date = new Date();
        int aleatorio = (int) (Math.random() * 1000 + 1);
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");

        UploadedFile file;
        Boolean blGrabarArchivo = true;

        if (fileNuevo != null || fileEditar != null) {
            if (nuevasolicitud.getId() == 0) {
                file = fileNuevo;
                blGrabarArchivo = true;
            } else {
                file = fileEditar;
                if (fileEditar == null) {
                    blGrabarArchivo = false;
                }
            }
            //STARTPATH = "d:/";
            String path = STARTPATH + "documentosolicitud/";

            //valida extension del archivo        
            String sArchivoExtension;
            sArchivoExtension = getExtension(file.getFileName());
            if (sArchivoExtension.equals("ERROR")) {
                formsubida.recordError("El nombre del archivo no puede contener puntos.");
                return this;
            } else if (sArchivoExtension.equalsIgnoreCase("pdf") || sArchivoExtension.equalsIgnoreCase("jpg")
                    || sArchivoExtension.equalsIgnoreCase("doc") || sArchivoExtension.equalsIgnoreCase("docx")) {
                //extension valida
            } else {
                formsubida.recordError("Solo puede subir archivos con la siguiente extension: .pdf, .jpg, .doc, .docx");
                error = 1;
            }

            //valida tamanio maximo de carga
            int iTamanioMaximo = 3145728;
            if (file.getSize() > iTamanioMaximo) {
                formsubida.recordError("El tamaño maximo de carga del documento es 3MB");
                error = 1;
            }
            if (error == 1) {
                return this;
            }

            String[] strings = file.getFileName().split("\\.");
            String nombreArchivos = strings[0].replaceAll(" ", "") + (sdf.format(date) + "-" + aleatorio)
                    + "." + strings[1];

            File nuevo = new File(path + nombreArchivos);
            copied = new File(path);
            if (!copied.exists()) {
                copied.mkdirs();
            }

            file.write(nuevo);
            nuevasolicitud.setDocumento(path + nombreArchivos);
        }
//        if (trabajador == null) {
//            trabajador = new Funcionario();
//        }

        nuevasolicitud.setNombres(bnombres.toUpperCase());
        nuevasolicitud.setApellidoPaterno(bapellidoPaterno.toUpperCase());
        nuevasolicitud.setApellidoMaterno(bapellidoMaterno.toUpperCase());
        nuevasolicitud.setEmail(bemailLaboral);
        nuevasolicitud.setTelefono(btelefonofijo);
        nuevasolicitud.setDen_cargo(bcargo.toUpperCase());
        nuevasolicitud.setNroDocumento(bnroDocumento.toUpperCase());
//        nuevasolicitud.setFlg_usuario(true);

        DatoAuxiliar docuIdentidadNuevo;
        docuIdentidadNuevo = new DatoAuxiliar();
        docuIdentidadNuevo.setId(bdocumentoidentidad.getId());

        nuevasolicitud.setDocumentoidentidad(docuIdentidadNuevo);
//
//        session.saveOrUpdate(trabajador);
//        nuevasolicitud.setTrabajador(trabajador);
        nuevasolicitud.setPerfil(bperfil);
        nuevasolicitud.setNum_resolucion(bnum_resolucion);
        nuevasolicitud.setEstado(3); // Solicitud Pendiente

        session.saveOrUpdate(nuevasolicitud);
        session.flush();
        Encriptacion encripta = new Encriptacion();
        nuevasolicitud.setCodigo(encripta.MD5(Long.toString(nuevasolicitud.getId())));
        session.saveOrUpdate(nuevasolicitud);
        session.flush();

        //registrar usuario        
        usuarioSolicitud.setEstado(3L);
        usuarioSolicitud.setIntentos_fallidos(0L);
        usuarioSolicitud.setLogin(nuevasolicitud.getNroDocumento());
        usuarioSolicitud.setEntidad(selecentidad);
        //usuarioSolicitud.setRolid(new Long(2));
        //usuarioSolicitud.setTrabajador(nuevasolicitud.getTrabajador());
        usuarioSolicitud.setFecha_creacion(new Date());
        usuarioSolicitud.setNombres(nuevasolicitud.getNombres());
        usuarioSolicitud.setApellidoPaterno(nuevasolicitud.getApellidoPaterno());
        usuarioSolicitud.setApellidoMaterno(nuevasolicitud.getApellidoMaterno());
        usuarioSolicitud.setApellidoMaterno(nuevasolicitud.getApellidoMaterno());
        usuarioSolicitud.setEmaillaboral(nuevasolicitud.getEmail());
        usuarioSolicitud.setTelefono(nuevasolicitud.getTelefono());
        usuarioSolicitud.setNumeroDocumento(nuevasolicitud.getNroDocumento());
        usuarioSolicitud.setDocumentoId(nuevasolicitud.getDocumentoidentidad().getId());
        usuarioSolicitud.setSolicitudacceso(nuevasolicitud);
        usuarioSolicitud.setDenCargo(nuevasolicitud.getDen_cargo());
        usuarioSolicitud.setRutaArchivo(nuevasolicitud.getDocumento());
        usuarioSolicitud.setNumResolucion(nuevasolicitud.getNum_resolucion());
        usuarioSolicitud.setFecResolucion(nuevasolicitud.getFec_resolucion());
        session.saveOrUpdate(usuarioSolicitud);
        session.flush();

        ConfiguracionAcceso ca = (ConfiguracionAcceso) session.load(ConfiguracionAcceso.class, 1L);
        new Logger().loguearEvento(session, Logger.SOLICITUD_SANCION, entidad, 0, 0, Logger.MOTIVO_SOLICITUD_SANCION, nuevasolicitud.getId());
        String lsMensaje = "Su solicitud de usuario de acceso al RNSDD será procesada dentro de 5 días hábiles.<br/><br/>Número de Solicitud: <strong>" + nuevasolicitud.getId() + "</strong>";
        if (SMTPConfig.sendMail("Datos de acceso al Modulo de Sanciones - Servir", lsMensaje, bemailLaboral, ca)) {
            System.out.println("Envío Correcto");
        } else {
            Logger logger = new Logger();
            logger.loguearEvento(session, logger.ERROR_SERVIDOR_DE_CORREO, entidad, 0, 0, Logger.CORREO_FAIL_RESET_PASSWORD, 0);
        }

        onReset();
        respuestaOk = true;

        return this;
    }

    @Log
    Object onValueChangedFromTipo_documento(DatoAuxiliar dato) {
        if (dato != null) {
            bapellidoPaterno = null;
            bapellidoMaterno = null;
            bnombres = null;
            bnroDocumento = null;
            if (dato.getCodigo() == 1) {
                //mensajeVali="El número de DNI debe tener 8 dígitos (y solo números)";
                regeVali = "^[0-9]{8}$";
                maxlength = 8;
            } else {
                //mensajeVali="";
                regeVali = "^[a-zA-Z0-9]{12}$";
                maxlength = 12;
            }
        }
        return new MultiZoneUpdate("solicitudZone", solicitudZone.getBody());
    }

    @Log
    public List<UsuarioTrabajador> getUsuarios(Long documentoidentidad, String numerodocumento, String estado, Long entidadid) {
        Criteria c = session.createCriteria(UsuarioTrabajador.class);
        if (documentoidentidad != null) {
            c.add(Restrictions.eq("documentoidentidadid", documentoidentidad));
        }
        if (numerodocumento != null) {
            c.add(Restrictions.eq("nrodocumento", numerodocumento));
        }
        if (estado != null) {
            c.add(Restrictions.eq("estado", Integer.parseInt(estado)));
        }
//        if (entidadid != null) {
//            c.add(Restrictions.eq("entidadid", entidadid));
//        }
        return c.list();
    }

    @Log
    public List<UsuarioTrabajador> getUsuarioBySolicitudID(Long trabaid, Long solicitudid, Long usuarioid) {
        Criteria c = session.createCriteria(UsuarioTrabajador.class);
        if (trabaid != null) {
            c.add(Restrictions.eq("trabajadorid", trabaid));
        }
        if (solicitudid != null) {
            c.add(Restrictions.eq("solicitudid", solicitudid));
        }
        if (usuarioid != null) {
            c.add(Restrictions.ne("id", usuarioid));
        }
        return c.list();
    }

    @Log
    static public String getExtension(String path) {
        String[] strings = path.split("\\.");
        if (strings.length > 2) {
            return "ERROR";
        } else {
            return strings[strings.length - 1];
        }

    }

    @Log
    public Boolean validarEstadoConsulta(String estado, Session session) {

        System.err.println("estado validar consulta: " + estado);

        if ("NTP".equals(estado)) {
            mensajeErrorRENIEC = "No tienen permisos de acceso al método consulta.";
            return false;
        }
        if ("SINV".equals(estado)) {
            mensajeErrorRENIEC = "Código de Sesión ingresado inválido.";
            return false;
        }
        if ("UNL".equals(estado)) {
            mensajeErrorRENIEC = "Aplicación que consulta a Web Service no se ha autenticado.";
            return false;
        }
        if ("5".equals(estado)) {
            mensajeErrorRENIEC = "Excedió el máximo número de consultas asignadas por día.";
            return false;
        }
        if ("3".equals(estado)) {
            mensajeErrorRENIEC = "Esta consultando en un día y hora no permitido según convenio.";
            return false;
        }
        if ("DNE".equals(estado)) {
            mensajeErrorRENIEC = "El DNI consultado es inválido.";
            return false;
        }
        if ("DNV".equals(estado)) {
            mensajeErrorRENIEC = "El DNI del usuario de la empresa es inválido. No está autorizado a consultar.";
            return false;
        }
        if ("0002".equals(estado)) {
            mensajeErrorRENIEC = "El Servidor no puede atender el requerimiento.";
            return false;
        }
        //OK
        if ("0000".equals(estado)) {
            return true;
        }

        mensajeErrorRENIEC = "Error no identificado";

        return false;
    }

    @Log
    StreamResponse onActionFromReturnStreamResponse() {
        return new StreamResponse() {
            InputStream inputStream;

            @Override
            public void prepareResponse(Response response) {
                File fileADescargar = new File(bdocumento_adjunto);

                try {
                    inputStream = new FileInputStream(fileADescargar);
                } catch (FileNotFoundException ex) {
//                    java.util.logging.Logger.getLogger(batch_dev.class.getName()).log(Level.SEVERE, null, ex);
                }

                try {
                    response.setHeader("Content-Type", "application/x-zip");
                    response.setHeader("Content-Disposition", "inline; filename=" + fileADescargar.getName());
                    response.setHeader("Content-Length", "" + inputStream.available());
                } catch (IOException e) {
//                    java.util.logging.Logger.getLogger(batch_dev.class.getName()).log(Level.SEVERE, null, e);
                }
            }

            @Override
            public String getContentType() {
                return "application/x-zip";
            }

            @Override
            public InputStream getStream() throws IOException {
                return inputStream;
            }
        };
    }

    @Log
    void onapellido_paternoChanged() {
        bapellidoPaterno = _request.getParameter("param");
    }

    @Log
    void onapellido_maternoChanged() {
        bapellidoMaterno = _request.getParameter("param");
    }

    @Log
    void onnombresChanged() {
        bnombres = _request.getParameter("param");
    }

    @Log
    void onemailLaboralChanged() {
        bemailLaboral = _request.getParameter("param");
    }

    @Log
    void ontelefonofijoChanged() {
        btelefonofijo = _request.getParameter("param");
    }

    @Log
    void oncargoChanged() {
        bcargo = _request.getParameter("param");
    }
    
    @Log
    void onResolChanged() {
        bnum_resolucion = _request.getParameter("param");
    }
}
